package uy.org.softtech.cssuite.web.controladores;

import static org.springframework.util.Assert.notNull;
import static org.springframework.web.servlet.support.RequestContextUtils.getLocale;

import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Configuration;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import uy.org.softtech.cssuite.core.Controlador;
import uy.org.softtech.cssuite.servicios.ServiciosUsuarios;
import uy.org.softtech.cssuite.web.modelo.ModeloCredenciales.Paso;

/**
 * Controlador encargado de manejar las solicitudes de reclamos.
 * 
 * @author fabian.lobo
 */
@Configuration
@Controller("controlador-reclamos")
@ManagedResource(
	objectName = "cssuite:type=Controlador,name=ControladorReclamos", 
	description = "Controlador encargado de manejar las solicitudes de reclamos.",
	log = true, logFile = "jmx.log", currencyTimeLimit = 15,
	persistPolicy = "OnUpdate", persistPeriod = 200
)
public class ControladorReclamos extends Controlador {

	private Logger log = Logger.getLogger(getClass());
	
	@Resource(name = "servicios-usuarios" )
	private ServiciosUsuarios serviciosUsuarios;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		super.inicializacion();
		
		notNull(serviciosUsuarios(), "La propiedad [serviciosUsuarios] de [" + getClass().getName() + "] no ha sido establecida.");
		
		log.info("Controlador encargado de manejar las solicitudes de reclamos ha sido inicializado.");
	}
	
	/* 
	 * ---------------------------------------
	 * ------------    RECLAMOS  -------------
	 * ---------------------------------------
	 */
	
	/**
	 * Procesa las solicitudes de reclamos.
	 * 
	 * @author fabian.lobo
	 */
	@RequestMapping(method = RequestMethod.GET, value = "reclamos.do", params = {"accion"})
	@Secured(value = {"IS_AUTHENTICATED_ANONYMOUSLY"})
	public ModelAndView reclamos(HttpServletRequest request, @RequestParam("accion") Accion accion, @RequestParam(value = "paso", required = false) Paso paso){
		Locale locale = getLocale(request);
		switch(accion) {
		case CREDENCIALES:
			switch(paso) {
			case SOLICITAR:
				String usuario = request.getParameter("usuario");
				if (StringUtils.hasText(usuario)) {
					serviciosUsuarios().remuevoToken(usuario);
				}
				break;
			}
			break;
		}
		
		ModelAndView respuesta = new ModelAndView("general");
		respuesta.addObject("mensaje", fuenteMensajes().getMessage("mensaje.reclamoRecibido", null, "Estamos procesando la información para tomar las medidas necesarias. Muchas gracias por su aporte.", locale));
		return respuesta;
	}
	
	/*
	 *  GETTERS
	 */
	public ServiciosUsuarios serviciosUsuarios() {
		return serviciosUsuarios;
	}
}
